<?php
/**
 * 文件夹处理类
 * 
 * @version $Id: Dir.php 404 2012-11-29 03:59:27Z linsir123 $
 * @package Common
 */
class lpDir
{
	/**
	 * 级联创建目录
	 * 
	 * @param string $dir 待处理的目录
	 * @param int $mode 创建模式
	 * @return bool
	 * @static 
	 */
	static function make($dir, $mode = 0777)
	{
		self::_setSafe($dir);
		
		///
		if (file_exists($dir) && is_dir($dir)) 
			return true;
			
		///
		self::make(dirname($dir), $mode);
		
		///
		return mkdir($dir) ? chmod($dir, $mode) : false;
	}
	
	/**
	 * 级联删除目录
	 * 
	 * @param string $dir 待处理的目录
	 * @return bool
	 * @static 
	 */
	static function remove($dir)
	{
		self::_setSafe($dir);
		
		///
		if ($dir == '' || $dir == '/' 
			 || (strlen($dir) == 3 && substr($dir, 1) == ':\\') 
			 || ! file_exists($dir)) return false;
			
		///
		if ($handle = opendir($dir)) {
			while (($file = readdir($handle)) !== false) {
				if ($file == '.' || $file == '..') 
					continue;
					
				///
				$fileAbs = $dir .DS. $file;
				if (is_dir($fileAbs)) {
					if ( ! self::remove($fileAbs)) 
						return false;
				} else 
					@unlink($fileAbs);
			}
			closedir($handle);
		}
		
		///
		return rmdir($dir);
	}
	
	/**
	 * 取得某个目录的使用情况
	 * 
	 * @param string $dir 待处理的目录
	 * @return int
	 * @static 
	 */
	static function du($dir)
	{
		self::_setSafe($dir);
		
		///
		if ( ! is_dir($dir) || ! is_readable($dir)) 
			return false;
			
		///
		$size = 0;
		if ($handle = opendir($dir)) {
			while (($file = readdir($handle)) !== false) {
				if ($file == '.' || $file == '..') 
					continue;
					
				///
				$fileAbs = $dir .DS. $file;
				if (is_dir($fileAbs)) 
					$size += self::du($fileAbs);
				else
					$size += @filesize($fileAbs);
			}
			closedir($handle);
		}
		
		///
		return $size;
	}
	
	/**
	 * 复制某个目录
	 * 
	 * @param string $dir 源目录
	 * @param string $dest 目标目录
	 * @return bool
	 * @static 
	 */
	static function copy($dir, $dest)
	{
		self::_setSafe($dir);
		
		///
		if ( ! is_dir($dir) || ! is_readable($dir)) 
			return false;
			
		///
		if ( ! file_exists($dest)) 
			mkdir($dest);
			
		///
		if ($handle = opendir($dir)) {
			while (($file = readdir($handle)) !== false) {
				if ($file == '.' || $file == '..') 
					continue;
					
				///
				$fileAbs = $dir .DS. $file;
				$fileDest = $dest .DS. $file;
				if (is_dir($fileAbs)) 
					self::copy($fileAbs, $fileDest);
				else
					copy($fileAbs, $fileDest);
			}
			closedir($handle);
		}
		
		///
		return true;
	}
	
	
	/// 以下为私有方法 ///
	
	
	/**
	 * 过滤目录
	 * 
	 * @param string $dir 待处理的目录
	 * @return string
	 * @static 
	 */
	private static function _setSafe(& $dir)
	{
		if (substr($dir, -1) == DS) 
			$dir = substr($dir, 0, -1);
	}
}
